package org.dxy.app.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.dxy.infrastructure.util.UserContext;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * MyBatis Plus 自动填充处理器
 * 用于自动填充创建时间、更新时间、创建人、更新人等字段
 * 
 * @author dxy
 * @createTime 2025/8/5 10:30
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时自动填充
     * 
     * @param metaObject 元对象
     */
    @Override
    public void insertFill(MetaObject metaObject) {

        // 自动填充创建时间
        this.strictInsertFill(metaObject, "createdTime", LocalDateTime.class, LocalDateTime.now());
        
        // 自动填充更新时间
        this.strictInsertFill(metaObject, "updatedTime", LocalDateTime.class, LocalDateTime.now());
        
        // 自动填充创建人（这里可以从SecurityContext或ThreadLocal中获取当前用户）
        String currentUser = getCurrentUser();
        this.strictInsertFill(metaObject, "createdBy", String.class, currentUser);
        
        // 自动填充更新人
        this.strictInsertFill(metaObject, "updatedBy", String.class, currentUser);
        
        // 自动填充逻辑删除标识（默认为0，表示未删除）
        this.strictInsertFill(metaObject, "deleted", Integer.class, 0);
        
    }

    /**
     * 更新时自动填充
     * 
     * @param metaObject 元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新填充...");
        
        // 自动填充更新时间
        this.strictUpdateFill(metaObject, "updatedTime", LocalDateTime.class, LocalDateTime.now());
        
        // 自动填充更新人
        String currentUser = getCurrentUser();
        this.strictUpdateFill(metaObject, "updatedBy", String.class, currentUser);
        
        log.info("更新填充完成");
    }

    /**
     * 获取当前用户
     * 优先级：ThreadLocal > Spring Security > HTTP请求头 > 默认值
     * 
     * @return 当前用户名
     */
    private String getCurrentUser() {
        try {
            // 方式1: 从ThreadLocal获取（推荐方式）
            if (UserContext.hasUser()) {
                return UserContext.getCurrentUser();
            }
            
            // 方式2: 从Spring Security Context获取
            // try {
            //     Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            //     if (authentication != null && authentication.isAuthenticated() 
            //         && !"anonymousUser".equals(authentication.getName())) {
            //         return authentication.getName();
            //     }
            // } catch (Exception e) {
            //     log.debug("从Spring Security获取当前用户失败", e);
            // }
            
            // 方式3: 从HTTP请求头获取
            // try {
            //     RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            //     if (requestAttributes instanceof ServletRequestAttributes) {
            //         HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            //         String userId = request.getHeader("X-User-Id");
            //         if (StringUtils.isNotBlank(userId)) {
            //             return userId;
            //         }
            //     }
            // } catch (Exception e) {
            //     log.debug("从请求头获取当前用户失败", e);
            // }
            
        } catch (Exception e) {
            log.warn("获取当前用户时发生异常", e);
        }
        
        // 默认返回系统用户
        return "admin";
    }
}